package cn.com.dhcc.app.pub.core.interceptor;

import java.io.IOException;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;

import cn.com.dhcc.app.core.HookPara;
import cn.com.dhcc.app.core.annotation.SiNoNeedAuth;
import cn.com.dhcc.app.core.annotation.SiNoNeedLogin;
import cn.com.dhcc.app.core.base.InterceptorBean;
import cn.com.dhcc.app.core.handler.ssohandler.SsoUser;
import cn.com.dhcc.app.core.handler.ssohandler.UserSessionVo;
import cn.com.dhcc.app.core.interceptor.InterceptorArgs;
import cn.com.dhcc.app.core.pubmodule.sysmgr.resmgr.service.ResourceService;
import cn.com.dhcc.app.core.service.Log;
import cn.com.dhcc.app.core.service.Log.LOGTYPE;

/**
 * 系统权限的控制
 * 
 * @日期：2012-12-14下午11:21:12
 * @作者：乔兵
 * @版权所有：东华软件
 * @版本：1.0
 */
@Component
public class AuthInterceptor extends InterceptorBean {

	private Logger logger = Log.getLogger(LOGTYPE.R);

	/**
	 * 验证过程：
	 * 1 判断资源对于的controller方法上是否有SiNoNeedLogin标记，如果有代表无需登录，直接通过，如果不是-->2
	 * 2 判断是否是单点，如果不是-->3 如果是-->4
	 * 3 从session里面获取用户，如果用户为空-->10,如果不为空-->5
	 * 4 需要从session里面获取单点放入的用户,如果用户为空-->10,如果不为空，封装放入自定义key的session里面-->5
	 * 5 验证是否是超级管理员，如果是-->直接通过，如果不是-->6
	 * 6判断资源对于的controller方法上是否有SiNoNeedAuth标记，如果有代表需要登录但是不需要权限，直接通过，如果不是-->7
	 * 7 判断是否是（省和流域登录）如果是直接通过，如果不是-->8
	 * 8 获取用户岗位信息，如果没有岗位信息-->11，如果有-->9
	 * 9 验证用户岗位对于的资源里面是否有当前操作地址，如果有直接通过，如果没有-->11。
	 * 10 提示用户不存在，提示请登录-->12
	 * 11 提示没有权限-->12
	 * 12 结束验证
	 */
	@Override
	public SIGNAL beforeControllerMethodExecute(InterceptorArgs interceptorArgs) {
		HandlerMethod handlerMethod = interceptorArgs.getHandlerMethod();
		HttpServletRequest request = interceptorArgs.getRequest();
		if (request == null || request.getMethod() == null) {
			return SIGNAL.CONTINUE;
		}
		HttpServletResponse response = interceptorArgs.getResponse();
		//无需登录权限认证
		if (null != handlerMethod.getMethodAnnotation(SiNoNeedLogin.class)) {
			logger.info("佚名资源：" + request.getRequestURI());
			return SIGNAL.CONTINUE;
		} else {
			SsoUser user = getSessionVo(interceptorArgs).getLoginUser();
			if (user == null) {
				try {
					response.sendError(HookPara._NO_SESSION_ERROR_CODE, "请登录！");
				} catch (IOException e) {
				}
				return SIGNAL.STOP;
			} else {
				//如果是系统管理员，全部权限
				if (user.isSuperAdmin()) {
					return SIGNAL.CONTINUE;
				}
				if (null != handlerMethod.getMethodAnnotation(SiNoNeedAuth.class)) {
					logger.info("公共资源：" + request.getRequestURI());
					return SIGNAL.CONTINUE;
				}
				
				
				String cacheUrl = interceptorArgs.getCacheUrl();
				logger.info("验证资源权限：" + cacheUrl);
				if(ResourceService.inPublic(cacheUrl))return SIGNAL.CONTINUE;
				@SuppressWarnings("unchecked")
				List<String> userUrls = (List<String>) request.getSession().getAttribute(HookPara.USER_SESSION_URLS_KEY);

				if (userUrls != null && userUrls.contains(cacheUrl)) {
					return SIGNAL.CONTINUE;
				} else {
					logger.info("当前用户[" + user + "]无访问权限：" + cacheUrl);
					try {
						response.sendError(403, "没有访问权限！");
						return SIGNAL.STOP;
					} catch (IOException e) {
					}
				}
			}
			return SIGNAL.CONTINUE;
		}
	}
	/*private boolean thirdIsLogin(LoginUser user, HttpServletRequest request) {
		if(IngoreSso.isThirdAppRequest(request)){
			return LoginService.hasLogin(user.getId(), request.getParameter(HookPara.SSO_TOKEN_KEY));
		}
		return true;
	}*/
	
	@Override
	public SIGNAL interceptorExecuteErrorSignal(Exception beforeControllerMethodExecuteException) {
		return SIGNAL.STOP;
	}
	private UserSessionVo getSessionVo(InterceptorArgs interceptorArgs){
		UserSessionVo sessionVo = interceptorArgs.getUserSessionInfo();
		if(sessionVo==null)sessionVo = new UserSessionVo();
		return sessionVo;
	}
}
